// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

const db = cloud.database()
const $ = db.command.aggregate

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  console.log('当前访问帖子用户：', wxContext.OPENID)

  switch(event.type) {
    case 'getTieziList':
      return getTieziList(event)
    case 'insertTiezi':
      return insertTiezi(event)
    case 'getTieziById':
      return getTieziById(event)
    case 'getTieComments':
      return getTieComments(event)
    case 'addComment':
      return addComment(event)

    case 'checkeNotify':
      return checkeNotify(event)
  }
}

// 通过 id 获取帖子详情
async function getTieziById(event) {
  console.log('获取帖子详情参数：', event)

  const tieziRes = await db.collection('tiezi').doc(event.id).get()

  console.log('获取帖子详情：', tieziRes)

  const commentsRes = await db.collection('tiezi_comments').where({
    is_del: 1,
    topic_id: event.id
  })
  .get()

  console.log('获取帖子评论：', commentsRes)

  return {
    errCode: '200',
    errMsg: 'ok',
    data: {
      tiezi: tieziRes.data,
      comments: commentsRes.data
    }
  }
}

// 获取帖子列表
async function getTieziList(event) {
  const current = Number(event.current)
  const pageSize = Number(event.pageSize)
  const start = (current - 1) * pageSize

  const total = await db.collection('tiezi').where({
    is_del: 1
  }).count()

  console.log('查询帖子数量：', total)

  const result = await db.collection('tiezi')
    .aggregate()
    .lookup({
      from: 'tiezi_user',
      localField: 'user_id',
      foreignField: '_id',
      as: 'user_info'
    })
    .replaceRoot({
      newRoot: $.mergeObjects([ $.arrayElemAt(['$user_info', 0]), '$$ROOT' ])
    })
    .match({
      is_del: 1
    })
    .project({
      avatar: 1,
      user_name: 1,
      user_id: 1,
      tabs: 1,
      title: 1,
      top: 1,
      share: 1,
      star: 1
    })
    .skip(start)
    .limit(pageSize)
    .end()


  console.log('查询帖子列表：', result)

  return {
    errCode: '200',
    errMsg: '操作成功',
    data: result.list,
    total: total.total
  }
}

// 发布帖子
async function insertTiezi(event) {
  const res = await db.collection('tiezi')
  .add({
    data: {
      title: event.title,
      conetnt: event.content,
      tabs: '分类id',
      user_id: event.userId,
      top: 1, // 1-正常，2-置顶
      is_del: 1, // 1-正常，0-删除
      picUrl: event.files,
      star: 0,
      share: 0,
      create_at:  db.serverDate(), // 服务器时间
      update_at:  db.serverDate(),
    }
  })

  console.log('帖子创建成功：', res)

  return {
    errCode: '200',
    errMsg: 'ok'
  }
}

// 获取帖子所有评论
async function getTieComments(event) {
  const commentsRes = await db.collection('tiezi_comments').where({
    is_del: 1,
    topic_id: event.id
  })
  .get()

  console.log('获取帖子评论：', commentsRes)

  return {
    errCode: '200',
    errMsg: 'ok',
    data: commentsRes.data
  }
}

// 发表评论 / 发表回复
async function addComment(event) {
  console.log('收到评论参数：', event)

  // 第一种：直接评论
  const res = await db.collection('tiezi_comments')
  .add({
    data: {
      topic_id: event.tieziId, // 帖子Id
      conetnt: event.content,
      from_uid: event.userId, // 评论人
      
      create_at:  db.serverDate(), // 评论时间
      star: 0, 
      is_del: 1, // 1-正常，0-删除
      reply: []
    },
  })

  console.log('评论添加成功：', res)

  // 第二种情况：回复评论
  // 先找到评论，然后更新该条评论下的 reply 数组

  // 评论数据插入成功后，尽心消息通知
  // 需要创建消息通知表，当点赞、评论、回复的时候需要给这个表添加一条记录
  const resNotify = await db.collection('tiezi_notify')
  .add({
    data: {
      // _id: '', 消息 ID
      type: 1, //  1-评论 2-公告 3-私信 4-点赞 5-关注 6-回复
      send_id: event.userId, // 发送者 id
      is_read: 1, // 消息是否已读，0-已读 1-未读
      topic_id: event.tieziId, // 帖子Id
      conetnt_id: '', // 评论id
      target_id: '5b049cc861e7689506d4e74805100fef', // 接收通知的人
      create_at:  db.serverDate(), // 创建时间
      is_del: 1, // 1-正常，0-删除
    },
  })

  console.log('消息通知创建成功：', resNotify)

  return {
    errCode: '200'
  }
}

// 用于消息通知-返回某一个用户是否有新消息
async function checkeNotify(event) {
  console.log('返回用户新消息参数：', event)

  const res = await db.collection('tiezi_notify')
  .where({
    is_read: 1,
    target_id: event.userId
  })
  .get()

  console.log('查询到新消息：', res)

  return {
    errCode: '200',
    errMsg: 'ok',
    data: res.data
  }
}